home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1996 March / EnigmA AMIGA RUN 05 (1996)(G.R. Edizioni)(IT)[!][issue 1996-03][Skylink CD IV].iso / earcd / assembler / progasm1.lha / SORGENTI / LEZIONE3c.s < prev    next >
Text File  |  1994-10-30  |  9KB  |  244 lines

  1.  
  2. ; Lezione3c.s    ; BARRETTA CHE SCENDE FATTA CON MOVE&WAIT DEL COPPER
  3.         ; (PER FARLA SCENDERE USATE IL TASTO DESTRO DEL MOUSE)
  4.  
  5.     SECTION    SECONDCOP,CODE    ; anche in Fast va bene
  6.  
  7. Inizio:
  8.     move.l    4.w,a6        ; Execbase in a6
  9.     jsr    -$78(a6)    ; Disable - ferma il multitasking
  10.     lea    GfxName(PC),a1    ; Indirizzo del nome della lib da aprire in a1
  11.     jsr    -$198(a6)    ; OpenLibrary, routine della EXEC che apre
  12.                 ; le librerie, e da in uscita l'indirizzo
  13.                 ; di base di quella libreria da cui fare le
  14.                 ; distanze di indirizzamento (Offset)
  15.     move.l    d0,GfxBase    ; salvo l'indirizzo base GFX in GfxBase
  16.     move.l    d0,a6
  17.     move.l    $26(a6),OldCop    ; salviamo l'indirizzo della copperlist
  18.                 ; di sistema
  19.     move.l    #COPPERLIST,$dff080    ; COP1LC - Puntiamo la nostra COP
  20.     move.w    d0,$dff088        ; COPJMP1 - Facciamo partire la COP
  21.  
  22. mouse:
  23.     cmpi.b    #$ff,$dff006    ; VHPOSR - Siamo alla linea 255?
  24.     bne.s    mouse        ; Se non ancora, non andare avanti
  25.  
  26.     btst    #2,$dff016    ; POTINP - Tasto destro del mouse premuto?
  27.     bne.s    Aspetta        ; Se no, non eseguire Muovicopper
  28.  
  29.     bsr.s    MuoviCopper    ; Il primo movimento sullo schermo!!!!!
  30.                 ; Questa subroutine fa scendere il WAIT!
  31.                 ; e viene eseguita 1 volta ogni schermata video
  32.                 ; infatti bsr.s Muovicopper fa si che venga
  33.                 ; eseguita la routine nominata Muovicopper,
  34.                 ; al termine della quale, con RTS, il 68000
  35.                 ; torna qua ad eseguire la routine Aspetta,
  36.                 ; e cosi' via.
  37.  
  38.  
  39. Aspetta:            ; se siamo sempre alla linea $ff che abbiamo
  40.                 ; aspettato prima, non andare avanti.
  41.  
  42.     cmpi.b    #$ff,$dff006    ; siamo a $FF ancora? se si, aspetta la linea
  43.     beq.s    Aspetta        ; seguente ($00), altrimenti MuoviCopper viene
  44.                 ; rieseguito. Questo problema c'e' solo per
  45.                 ; le routine molto corte che possono essere
  46.                 ; eseguite in meno di "una linea del pennello
  47.                 ; elettronico", detta "linea raster": il
  48.                 ; ciclo mouse: aspetta la linea $FF, dopodiche'
  49.                 ; esegue MuoviCopper, ma se la esegue troppo
  50.                 ; in fretta ci troviamo sempre alla linea $FF
  51.                 ; e quando torniamo al mouse, alla linea $FF
  52.                 ; ci siamo gia', e riesegue Muovicopper,
  53.                 ; dunque la routine e' eseguita piu' di una
  54.                 ; volta al FRAME!!! Specialmente su A4000!
  55.                 ; questo controllo evita il problema aspettando
  56.                 ; la linea dopo, per cui tornando al mouse:
  57.                 ; per raggiungere la linea $ff e' necessario
  58.                 ; il classico cinquantesimo di secondo.
  59.                 ; NOTA: Tutti i monitor e i televisori
  60.                 ; disegnano lo schermo alla stessa velocita',
  61.                 ; mentre da computer a computer puo' variare
  62.                 ; la velocita' del processore. E' per questo
  63.                 ; che un programma temporizzato col $dff006
  64.                 ; va alla stessa velocita' su un A500 e su
  65.                 ; un A4000. La temporizzazione verra'
  66.                 ; affrontata meglio in seguito, per ora
  67.                 ; preoccupatevi di capire il copper e il
  68.                 ; funzionamento.
  69.  
  70.  
  71.     btst    #6,$bfe001    ; tasto sinistro del mouse premuto?
  72.     bne.s    mouse        ; se no, torna a mouse:
  73.  
  74.     move.l    OldCop(PC),$dff080    ; Puntiamo la cop di sistema
  75.     move.w    d0,$dff088        ; facciamo partire la cop
  76.  
  77.     move.l    4.w,a6
  78.     jsr    -$7e(a6)    ; Enable - riabilita il Multitasking
  79.     move.l    gfxbase(PC),a1    ; Base della libreria da chiudere
  80.                 ; (le librerie vanno aperte e chiuse !!!)
  81.     jsr    -$19e(a6)    ; Closelibrary - chiudo la graphics lib
  82.     rts
  83.  
  84. ;
  85. ;    Questa piccola routine fa scendere il wait del copper aumentandolo,
  86. ;    infatti la prima volta che sara' eseguito cambiera' il
  87. ;
  88. ;    dc.w    $2007,$FFFE    ; aspetto la linea $20
  89. ;
  90. ;    in:
  91. ;
  92. ;    dc.w    $2107,$FFFE    ; aspetto la linea $21! (poi $22,$23 ecc.)
  93. ;
  94. ;    NOTA: una volta raggiunto il valore massimo per un byte, ossia $FF,
  95. ;          se si esegue un ulteriore ADDQ.B #1,BARRA si riparte da 0,
  96. ;             fino a ritornare a $ff e cosi' via.
  97.  
  98. Muovicopper:
  99.     addq.b    #1,BARRA    ; WAIT 1 cambiato, la barra scende di 1 linea
  100.     rts
  101.  
  102. ; Provate a modificare questo ADDQ in SUBQ e la barretta salira'!!!!
  103.  
  104. ; Provate a cambiare l'addq/subq #1,BARRA in #2 , #3 o piu' e la velocita'
  105. ; aumentera', dato che ogni FRAME il wait si spostera' di 2,3 o piu' linee.
  106. ; (se il numero e' maggiore di 8 invece di ADDQ.B bisogna usare ADD.B)
  107.  
  108.  
  109. ;    DATI...
  110.  
  111.  
  112. GfxName:
  113.     dc.b    "graphics.library",0,0    ; NOTA: per mettere in memoria
  114.                     ; dei caratteri usare sempre il dc.b
  115.                     ; e metterli tra "", oppure ''
  116.  
  117. GfxBase:        ; Qua ci va l'indirizzo di base per gli Offset
  118.     dc.l    0    ; della graphics.library
  119.  
  120. OldCop:            ; Qua ci va l'indirizzo della vecchia COP di sistema
  121.     dc.l    0
  122.  
  123.  
  124. ;    DATI GRAFICI...
  125.  
  126.  
  127.     SECTION    GRAPHIC,DATA_C    ; Questo comando fa caricare dal sistema
  128.                 ; operativo questo segmento di dati
  129.                 ; in CHIP RAM, obbligatoriamente
  130.                 ; Le copperlist DEVONO essere in CHIP RAM!
  131.  
  132. COPPERLIST:
  133.     dc.w    $100,$200    ; BPLCON0 - no bitplanes, solo sfondo.
  134.  
  135.     dc.w    $180,$004    ; COLOR0 - Inizio la cop col colore BLU SCURO
  136.  
  137. BARRA:
  138.     dc.w    $7907,$FFFE    ; WAIT - aspetto la linea $79
  139.  
  140.     dc.w    $180,$600    ; COLOR0 - inizio la zona rossa: rosso a 6
  141.  
  142.     dc.w    $FFFF,$FFFE    ; FINE DELLA COPPERLIST
  143.  
  144.     end
  145.  
  146.  
  147. Ahh! Mi ero dimenticato di mettere il (PC) a "lea GfxName,a1", ma ora c'e'.
  148. Chi si era accorto che ci si poteva mettere ha preso una nota positiva.
  149. In questo programma viene eseguito un movimento sincronizzato con il
  150. pennello elettronico, infatti la barra scende fluidamente.
  151.  
  152. NOTA1: In questo listato puo' confondere la struttura del ciclo con il test
  153. del mouse piu' il test della posizione del pennello elettronico; quello
  154. che dovete aver chiaro e' che le routines, o subroutines che si trovano tra
  155. il loop mouse: e quello aspetta: sono eseguite 1 volta ogni fotogramma video:
  156. provate infatti a sostituire il bsr.s Muovicopper con la subroutine stessa,
  157. senza l'RTS finale ovviamente:
  158.  
  159. mouse:
  160.     cmpi.b    #$ff,$dff006    ; VHPOSR - Siamo alla linea 255?
  161.     bne.s    mouse        ; Se non ancora, non andare avanti
  162.  
  163. ;    bsr.s    MuoviCopper    ; Una routine eseguita ogni fotogramma
  164. ;                ; (Per la fluidita')
  165.  
  166.     addq.b    #1,BARRA    ; WAIT 1 cambiato, la barra scende di 1 linea
  167.  
  168. Aspetta:
  169.     cmpi.b    #$ff,$dff006    ; VHPOSR - Siamo alla linea 255?
  170.     beq.s    Aspetta        ; Se si, non andare avanti, aspetta la linea
  171.                 ; seguente, altrimenti MuoviCopper viene
  172.                 ; rieseguito
  173.  
  174. In questo caso il risultato non cambia perche' anziche' eseguire l'ADDQ come
  175. subroutine la eseguiamo direttamente, e forse in questo caso e' anche piu'
  176. comodo; ma quando le subroutine sono piu' lunghe conviene fare vari BSR per
  177. orientarsi. Per esempio se duplicate i bsr.s Muovicopper la routine sara'
  178. eseguita 2 volte per fotogramma, e raddoppiera' la velocita':
  179.  
  180.     bsr.s    MuoviCopper    ; Una routine eseguita ogni fotogramma
  181.     bsr.s    MuoviCopper    ; Una routine eseguita ogni fotogramma
  182.  
  183. L'utilita' delle subroutine sta proprio nella maggior chiarezza del programma,
  184. immaginatevi se le nostre routines da mettere tra mouse: e aspetta: fossero di
  185. migliaia di linee! il susseguirsi delle cose apparirebbe meno chiaro. Invece
  186. se chiamiamo per nome ogni singola routine il tutto apparira' piu' facile.
  187.  
  188. *
  189.  
  190. Per far scendere la barra basta cambiare la COPPERLIST, in particolare
  191. in questo esempio viene cambiato i WAIT, nel suo primo byte, ossia quello
  192. che definisce la linea verticale da attendere:
  193.  
  194. BARRA:
  195.     dc.w    $2007,$FFFE    ; WAIT - aspetto la linea $20
  196.     dc.w    $180,$600    ; COLOR0 - inizio la zona rossa: rosso a 6
  197.  
  198. Mettendo una label a quel byte, si puo' cambiare quel byte agendo sulla
  199. label stessa, in questo caso BARRA.
  200.  
  201. MODIFICHE:
  202. Provate a cambiare il colore anziche' il wait: basta mettere una label
  203. dove volete nella copperlist e potete cambiare quello che vi pare.
  204. Mettete barra al colore in questo modo:
  205.  
  206. COPPERLIST:
  207.     dc.w    $100,$200    ; BPLCON0 - no bitplanes, solo sfondo.
  208.  
  209.     dc.w    $180,$004    ; COLOR0 - Inizio la cop col colore BLU SCURO
  210.  
  211. ;;;;BARRA:            ; ** ANNULLO LA LABEL VECCHIA coi ;;
  212.     dc.w    $7907,$FFFE    ; WAIT - aspetto la linea $79
  213.  
  214.     dc.w    $180        ; COLOR0
  215. BARRA:                ; ** METTO LA LABEL NUOVA AL VALORE DEL COLORE.
  216.     dc.w    $600    ; inizio la zona rossa: rosso a 6
  217.  
  218.     dc.w    $FFFF,$FFFE    ; FINE DELLA COPPERLIST
  219.  
  220. Otterrete una variazione dell'intensita' del rosso, infatti cambiamo il
  221. primo byte a sinistra del colore: $0RGB, ossia il $0R, ossia il ROSSO!!!!
  222.  
  223. Provate ora ad agire sull'intera WORD del colore: cambiate la routine cosi':
  224.  
  225.     addq.w    #1,BARRA    ; invece di .b operiamo sulla .w
  226.     rts
  227.  
  228. Provatelo e verificherete che i colori si susseguono irregolarmente, infatti
  229. sono il frutto del numero che aumenta: $601,$602... $631,$632... generando
  230. dei colori non ordinatamente.
  231.  
  232. NOTA:    il comando dc.w mette in memoria dei bytes, delle word o delle long,
  233.     dunque si puo' ottenere lo stesso risultato scrivendo:
  234.  
  235.     dc.w    $180,$600    ; Color0
  236.  
  237.     oppure:
  238.  
  239.     dc.w    $180    ; Registro Color0
  240.     dc.w    $600    ; valore del color0
  241.  
  242.     Non ci sono problemi di sintassi come con i MOVE.
  243.  
  244.